package cn.xyfmzmy.chain.validation;

import cn.xyfmzmy.chain.exception.ValidationException;

import java.util.ArrayList;
import java.util.List;

/**
 * 校验参数的责任链
 */
public class ValidateChain {

    // 责任链的各个处理节点
    private final List<ValidateHandler> handlers = new ArrayList<>();

    public void validate(Object value){
        // 创建上下文
        ValidateContext validateContext = new ValidateContext(value);
        while(true){
            int index = validateContext.currentIndex();
            if(index == handlers.size()){
                // 说明执行完所有节点，退出
                break;
            }
            // 执行当前节点校验
            ValidateHandler handler = handlers.get(index);
            handler.validate(value,validateContext);
            if(index == validateContext.currentIndex()){
                // 说明当前节点没有执行doNext方法，退出
                break;
            }
        }
        validateContext.throwExceptionIfNessary();
    }

    public void addLastHandler(ValidateHandler handler){
        this.handlers.add(handler);
    }
}
